﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Wexflow.Core.Service.Common;

namespace Wexflow.Core
{
    /// <summary>
    /// 日期转化quartz.net cron
    /// </summary>
    public class DateConversion
    {
        // 由7段构成：秒 分 时 日 月 星期 年（可选）
        // 字段名         允许的值              允许的特殊字符
        // 秒              0-59                   , - * /  
        // 分              0-59                   , - * /  
        // 小时            0-23                   , - * /  
        // 日              1-31                   , - * ? / L W C
        // 月              1-12 or JAN-DEC        , - * /  
        // 周几            1-7 or SUN-SAT         , - * ? / L C #  
        // 年(可选字段)    empty, 1970-2099       , - * /

        //"-" ：表示范围 MON-WED表示星期一到星期三
        //"," ：表示列举 MON, WEB表示星期一和星期三
        //"*" ：表是“每”，每月，每天，每周，每年等
        //"/" :表示增量：0/15（处于分钟段里面） 每15分钟，在0分以后开始，3/20 每20分钟，从3分钟以后开始
        //"?" :只能出现在日，星期段里面，表示不指定具体的值
        //"L" :只能出现在日，星期段里面，是Last的缩写，一个月的最后一天，一个星期的最后一天（星期六）
        //"W" :表示工作日，距离给定值最近的工作日
        //"#" :表示一个月的第几个星期几，例如："6#3"表示每个月的第三个星期五（1=SUN...6=FRI,7=SAT）


        public static string Start(Workflow wf)
        {
            SplitTime splitTime = new SplitTime(wf.Period.ToString().Split(':'));
            string intervalValue = wf.IntervalValue;
            switch (wf.IntervalType)
            {
                case IntervalType.H:
                    return String.Format("* * 0/{0} * * ?", intervalValue);
                //return String.Format("5/{0} * * * * ?", intervalValue);
                case IntervalType.D:
                    //每天 h:m：s 触发
                    return String.Format("{0} {1} {2} * * ?", splitTime.Second, splitTime.Miute, splitTime.Hour);
                case IntervalType.D1:
                    WeekHelper.CheckInterval(intervalValue, IntervalType.D1);
                    //每天 h:m：s 触发
                    return String.Format("{0} {1} {2} * * ?", splitTime.Second, splitTime.Miute, splitTime.Hour);
                case IntervalType.W:
                    WeekHelper.CheckInterval(intervalValue, IntervalType.W);
                    return String.Format("{0} {1} {2} ? * {3}", splitTime.Second, splitTime.Miute, splitTime.Hour, "FRI");
                case IntervalType.M:
                    WeekHelper.CheckInterval(intervalValue, IntervalType.M);
                    string[] date = intervalValue.Split(',');
                    return String.Format("{0} {1} {2} {3} {4} ?", splitTime.Second, splitTime.Miute, splitTime.Hour, date[1],date[0]);
                case IntervalType.M1:
                    return String.Format("{0} {1} {2} L * ?", splitTime.Second, splitTime.Miute, splitTime.Hour);
                case IntervalType.DEFINE:
                    return intervalValue.ToString(); ;
                default:
                    break;
            }
            return "";
        }
    }

    public class SplitTime
    {
        public string Hour { get; set; } = "00";
        public string Miute { get; set; } = "00";
        public string Second { get; set; } = "00";

        public SplitTime() { }

        public SplitTime(string[] time)
        {

            for (int i = 0; i < time.Length; i++)
            {
                if (i == 0)
                {
                    Hour = time[i];
                }
                else if (i == 1)
                {
                    Miute = time[i];
                }
                else if (i == 2)
                {
                    Second = time[i];
                }
            }
        }
    }
}


